from django.http import HttpResponse, JsonResponse
import django_redis
from django.shortcuts import render
from django.views.generic import View
import string
import random
from captcha.image import ImageCaptcha
from django_redis import get_redis_connection
import logging
from mgproject.utils.huyi_sms.sms3 import send_sms_code
# Create your views here.

logger = logging.getLogger('django')


class ImageCode(View):

    def get(self, request, uuid):
        """
        获取图片验证码资源
        :param request:
        :param uuid:
        :return:
        """

        # 第一步，随机生成验证码字符串（4位数值类型）
        seed = string.digits  # 0123456789
        # print(seed)
        r = random.choices(seed, k=4)  # ['1', '3', '4', '9']
        imgcode_str = ''.join(r)  # '1349'

        # 根据生成的验证码字符串创建一个图片验证码资源
        # 生成图片资源
        imgcode = ImageCaptcha().generate(chars=imgcode_str)

        # 保存验证码图片到redis数据库
        redis_conn = get_redis_connection('verify_code')
        imguid = 'img%s' % uuid
        redis_conn.setex(imguid, 300, imgcode_str)
        # 返回资源给前端)
        return HttpResponse(imgcode, content_type='img/png')


class CheckImgCode(View):
    def get(self, request, uuid):
        redis_conn = get_redis_connection('verify_code')
        imgcode = redis_conn.get('img%s' % uuid).decode('utf-8').lower()
        return JsonResponse({'code': 200, 'errormsg': 'OK', 'imgcode': imgcode})


class SMScodeView(View):
    def get(self, request, phone):
        """
        发送短信验证码功能
        :param request:
        :param phone:
        :return:
        """

        # 第一步：获取请求参数（路径参数+查询字符串）
        img_client = request.GET.get('imgcode', '')
        uuid = request.GET.get('uuid', '')
        # 第二步：校验参数
        if not all([phone, img_client, uuid]):
            return JsonResponse({'code': '4001', 'errormsg': '缺少必传参数！！'})

        # print(phone, '===========')
        # 第三步：获取服务器端生成的图片验证码
        redis_conn = django_redis.get_redis_connection('verify_code')
        is_send = redis_conn.get('is_send %s' % phone)

        if is_send:
            return JsonResponse({'code': '4004', 'errormsg': '验证码发送过于频繁！！'})

        imgcode_server = redis_conn.get('img%s' % uuid)

        # 第四步：匹配（非空+一致性判断）
        if imgcode_server is None:
            return JsonResponse({'code': '4002', 'errormsg': '图片验证码已失效！！'})
        # 判断是否频繁发送
        if img_client.lower() != imgcode_server.decode('utf-8').lower():
            return JsonResponse({'code': '4003', 'errormsg': '您输入的验证码有误！！'})
        # 第五步：删除图片验证码（避免用户恶意测试）
        try:
            redis_conn.delete('img%s' % uuid)
        except Exception as e:
            logger.error(e)
        # 第六步：生成短信验证码(6位数字字符串)
        seed = string.digits
        r = random.choices(seed, k=6)
        smscode_str = "".join(r)
        print(f'短信验证码为：{smscode_str}')

        # # 第七步：保存短信验证码到redis数据库中
        # redis_conn.setex('sms%s' % phone, 60, smscode_str)
        # redis_conn.setex('is_send%s' % phone, 60, 1)

        # # 异步执行发送短信验证码功能========(// 异步成功但是发送短信失败)
        # from mgproject.celery_tasks.sms.tasks import huyi_send_sms_code
        # # Celery异步发送短信验证码
        # ret = huyi_send_sms_code.delay(phone, smscode_str)

        # 获取管道对象
        pl = redis_conn.pipeline()
        pl.setex('sms%s' % phone, 60, smscode_str)
        pl.setex('is_send%s' % phone, 60, 1)
        pl.execute()

        # 8. 根据外部接⼝返回值响应前端结果
        # if ret:  # 执⾏⼀个任务就返回⼀个taskid 689e889c-a607-49f3-9777-248a8dcce310
        #     return JsonResponse({'code': '200', 'errormsg': 'OK'})
        #
        # return JsonResponse({'code': '5001', 'errormsg': '发送短信验证码错误'})

        # # 第八步：发送短信验证码
        # ret = send_sms_code(smscode_str, phone)
        # 第九步：根据外部接口返回值响应前端结果
        ret = {'code': 2}

        if ret.get('code') == 2:
            return JsonResponse({'code': '200', 'errormsg': 'OK'})
        return JsonResponse({'code': '5001', 'errormsg': '发送短信验证码错误！！'})


class CheckSMScode(View):
    def get(self, request, phone):
        """
        用户注册时候的短信验证码校验
        :param request:
        :param phone:
        :return:
        """
        # 建立redis数据库连接
        redis_conn = django_redis.get_redis_connection('verify_code')

        # 1.接收请求参数
        smscode_client = request.GET.get('smscode', '')
        # 2.校验参数
        if not all([phone, smscode_client]):
            return JsonResponse({'code': '4001', 'errormsg': '缺少必传参数！！'})

        # 3.查询服务器端的短信验证码
        smscode_server = redis_conn.get('sms%s' % phone)
        # 4.匹配
        if smscode_server is None:
            return JsonResponse({'code': '4002', 'errormsg': '短信验证码已失效！！'})

        smscode_server = smscode_server.decode('utf-8')
        if smscode_server != smscode_client:
            return JsonResponse({'code': '4003', 'errormsg': '短信验证码不一致！！'})

        # 5.响应结果
        return JsonResponse({'code': '200', 'errormsg': 'OK'})
